package cn.ym.ymcc.service.impl;

import cn.ym.ymcc.constant.CustomConstant;
import cn.ym.ymcc.domain.CourseType;
import cn.ym.ymcc.mapper.CourseTypeMapper;
import cn.ym.ymcc.query.CourseTypeQuery;
import cn.ym.ymcc.result.PageList;
import cn.ym.ymcc.service.ICourseTypeService;
import cn.ym.ymcc.vo.CourseTypeCrumbsVo;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author 210513347@qq.com
 * @since 2023-05-08
 */
@Service
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {


    @Autowired
    private CourseTypeMapper courseTypeMapper;


    /**
     * 面包屑
     * @param courseTypeId
     * @return
     */
    @Override
    public List<CourseTypeCrumbsVo> crumbs(Long courseTypeId) {
        // 1.根据id查询类型
        CourseType courseType = selectById(courseTypeId);
        // 2.根据点分割pash获取当前id与所有父id
        String[] ids = courseType.getPath().split("\\.");
        //3.把分割出来的id弄成list，
        //根据ID批量查询split中所有课程类型
        List<CourseType> courseTypes = selectBatchIds(Arrays.asList(ids));
        //4.用一个list来装s
        List<CourseTypeCrumbsVo> crumbs = new ArrayList<>();

        // 5.遍历类对象集合
        for (CourseType type : courseTypes) {
            // 将每个自己和同级封装到CrumbDto对象中，并存入到结果集里面返回
            Wrapper<CourseType> Wrapper = new EntityWrapper<>();
            Wrapper.notIn("id", type.getId());//排除自己
            Wrapper.eq("pid", type.getPid());
            List<CourseType> courseTypeList = selectList(Wrapper);//拿到了兄弟们
            crumbs.add(new CourseTypeCrumbsVo(type, courseTypeList));
        }
        return crumbs;

    }





    /**
     * 查询出课程分类的树形结构
     */
    @Override
    @Cacheable(cacheNames = CustomConstant.COURSETYPE_CACHE_NAMES,key = CustomConstant.KEY)
    public List<CourseType> treeData() {
        //1.先查询出使用的课程分类
        List<CourseType> courseTypes = courseTypeMapper.selectList(null);
//        //2.将所有课程分类查询出来 - 装到map集合 => 为了方便通过id找课程分类
//        //3.遍历课程分类--
        Map<Long, CourseType> map = courseTypes.stream().collect(Collectors.toMap(CourseType::getId, courseType -> courseType));
        //4.用一个list来装课程分类数据
        List<CourseType> treeData = new ArrayList<>();
        for (CourseType courseType : courseTypes) {
            //4.1没有上级
            if (courseType.getPid() == null || courseType.getPid().longValue()==0  ){
                //直接装到list里面
                treeData.add(courseType);
            }else {//4.2：有父部门id，装到list里面
                CourseType parentCourseType = map.get(courseType.getPid());
                if (parentCourseType!=null){//防止空指针
                    parentCourseType.getChildren().add(courseType);
                }
            }
        }
        return treeData;
    }





    @Override
    public List<CourseType> selectByPid(Long pid) {

        return courseTypeMapper.selectByPid(pid);
    }

    @Override
    public PageList<CourseType> queryPage(CourseTypeQuery query) {
        Wrapper<CourseType> wrapper = new EntityWrapper<>();
        if(!StringUtils.isEmpty(query.getKeyword())){
            wrapper.like("name", query.getKeyword());
        }
        Integer count = courseTypeMapper.selectCount(wrapper);
        if(count==0){
            return new PageList<>();
        }
        List<CourseType> courseTypes = courseTypeMapper.selectPageByQuery(query);
        return new PageList<>(Long.valueOf(count), courseTypes);
    }


    @Override
    @CacheEvict(cacheNames = CustomConstant.COURSETYPE_CACHE_NAMES,key = CustomConstant.KEY)
    public boolean insert(CourseType entity) {
        return super.insert(entity);
    }

    @Override
    @CacheEvict(cacheNames = CustomConstant.COURSETYPE_CACHE_NAMES,key = CustomConstant.KEY)
    public boolean deleteById(Serializable id) {

        return super.deleteById(id);
    }


    @Override
    @CacheEvict(cacheNames = CustomConstant.COURSETYPE_CACHE_NAMES,key = CustomConstant.KEY)
    public boolean updateById(CourseType entity) {

        return super.updateById(entity);
    }


}
